package Dao;

import java.util.Date;
import java.util.List;

import javax.persistence.TemporalType;
import javax.persistence.TypedQuery;

import Basicas.Apartamento;
import Basicas.Hospedagem;
import Basicas.SituacaoApartamento;
import ModelRelatorio.RelatorioPorHora;
import ModelRelatorio.RelatorioPorMes;

public class DAOHospedagem extends DAOGenerico<Hospedagem> implements IDAOHospedagem {

	public Hospedagem hospedagemFindByApSit(Apartamento ap, SituacaoApartamento sit){
		
		TypedQuery<Hospedagem> tq = getEntityManager().createNamedQuery("HospedagemFindByApOcupado",Hospedagem.class);
		tq.setParameter("valor1",ap);
		tq.setParameter("valor2",sit);
		List<Hospedagem> retorno = tq.setMaxResults(1).getResultList();
		if(retorno.isEmpty()){
			return null;
		}
		
		return retorno.get(0);
	}
	
	public List<RelatorioPorMes> pesquisarMovimentacaoMensal(Integer ano){
		TypedQuery<RelatorioPorMes> tq = getEntityManager().createQuery(
				"SELECT NEW ModelRelatorio.RelatorioPorMes(count(h.codigo) as qnt, MONTH(h.tempoOcupacao.entrada) as mes) "
				+ "FROM Hospedagem h WHERE YEAR(h.tempoOcupacao.entrada) =:ano "
				+ "GROUP BY MONTH(h.tempoOcupacao.entrada)"
				,RelatorioPorMes.class);
		tq.setParameter("ano",ano);		
		
		return tq.getResultList();
	}
	
	public List<RelatorioPorHora> pesquisarMovimentacaoHora(Date inicio, Date fim){
		TypedQuery<RelatorioPorHora> tq = getEntityManager().createQuery(
				"SELECT NEW ModelRelatorio.RelatorioPorHora(count(h.codigo) as qnt,  HOUR(h.tempoOcupacao.entrada) as hora)"
				+ "FROM Hospedagem h WHERE h.tempoOcupacao.entrada >=:inicio AND h.tempoOcupacao.entrada <:fim "
				+ "GROUP BY HOUR(h.tempoOcupacao.entrada)",RelatorioPorHora.class);

		tq.setParameter("inicio",inicio,TemporalType.DATE);
		tq.setParameter("fim",fim,TemporalType.DATE);
		return tq.getResultList();
	}
}
